#ifndef CHARTWIDGET_H
#define CHARTWIDGET_H

#include "DatabaseManager.h"
#include <QWidget>
#include <QVBoxLayout>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
#include <QtCharts/QValueAxis>
#include <QTimer>
#include <QVector>
#include <QPair>
#include <qmutex.h>

class ChartWidget : public QWidget
{
    Q_OBJECT

public:
    explicit ChartWidget(QWidget *parent = nullptr);
    ~ChartWidget();

    // 控制图表更新
    void startUpdating();
    void stopUpdating();
    void setUpdatingEnabled(bool enabled);
    void setTimeWindow(double seconds);
    void clearAllData();
    void cleanOldData();                 // 清理旧数据方法

    // 添加数据方法
    void appendEegData(double fp1, double fpz, double fp2, qint64 timestamp);
    void appendEcgData(const QVector<double> &values, qint64 timestamp);
    void appendGsrData(double bioZI, double bioZQ, qint64 timestamp);
    void updateECGData(const QVector<double> &data, int channelIndex);

    // 设置延迟显示模式
    void setDelayedDisplayMode(bool enabled);

    // 从数据库加载历史数据
    void loadHistoricalData(DatabaseManager* db, qint64 startTime, qint64 endTime);

private slots:
    void updateAllCharts();
    void enhanceVisualization();
    void processBatchData();

private:
    // 创建和更新图表的辅助方法
    QChartView* createChartView(const QString& title, const QString& yAxisTitle,
                                const QStringList& channelNames, int channelCount);

    void updateChart(QVector<QLineSeries*>& series, QVector<QPointF> buffer[],
                     QValueAxis* axisX, QValueAxis* axisY, int channelCount,
                     QPair<double, double>& yRange);

    void enhanceChartVisualization(QVector<QLineSeries*>& series,
                                   QChartView* chartView,
                                   QValueAxis* axisX,
                                   QValueAxis* axisY,
                                   const QString& title,
                                   double offsetStep);

    void updateTimeWindow(QVector<QLineSeries*>& series, QValueAxis* axisX);
    void setupChartStyle(QChartView* chartView,
                    QValueAxis* axisX,
                    QValueAxis* axisY,
                    const QString& title);

    // 布局和UI组件
    QVBoxLayout* m_mainLayout;
    QChartView* m_eegChartView;
    QChartView* m_ecgChartView;
    QChartView* m_gsrChartView;

    // 图表系列
    QVector<QLineSeries*> m_eegSeries;
    QVector<QLineSeries*> m_ecgSeries;
    QVector<QLineSeries*> m_gsrSeries;

    // 坐标轴
    QValueAxis* m_eegAxisX;
    QValueAxis* m_eegAxisY;
    QValueAxis* m_ecgAxisX;
    QValueAxis* m_ecgAxisY;
    QValueAxis* m_gsrAxisX;
    QValueAxis* m_gsrAxisY;

    // 数据缓冲区
    QVector<QPointF> m_eegBuffer[3];
    QVector<QPointF> m_ecgBuffer[8];
    QVector<QPointF> m_gsrBuffer[2];

    // 批处理缓冲区
    QVector<QVector<QPointF>> m_ecgBatchBuffer;
    QVector<QVector<QPointF>> m_eegBatchBuffer;
    QTimer* m_batchProcessTimer = nullptr;

    // 时间和更新控制
    qint64 m_startTime;
    QTimer* m_updateTimer;
    double m_timeWindow;
    int m_yAxisUpdateCounter;
    int m_yAxisUpdateInterval;
    int m_ecgDataBatchCounter;
    bool m_updatingEnabled;

    // 延迟显示模式
    bool m_delayedDisplayMode = false;
    int m_displayDelay;
    // 新增变量
    const int MAX_DISPLAY_POINTS = 1250; // 5秒 * 250Hz = 1250点
    const int MAX_BUFFER_SIZE = 2500;    // 10秒数据的缓冲区
    QTimer* m_bufferCleanTimer;          // 缓冲区清理定时器
    static const int UPDATE_INTERVAL_MS = 40;  // 从4ms增加到40ms
    static const int MAX_POINTS_PER_SERIES = 1000;  // 减少保留的点数
    // Y轴范围记忆
    QPair<double, double> m_eegYRange;
    QPair<double, double> m_ecgYRange;
    QPair<double, double> m_gsrYRange;

    QMutex m_bufferMutex;      // 原有的通用锁
    mutable QMutex m_ecgBufferMutex;   // ECG专用锁
    mutable QMutex m_gsrBufferMutex;   // GSR专用锁
    mutable QMutex m_eegBufferMutex;   // EEG专用锁
};

#endif // CHARTWIDGET_H
